fn main() {
    println!("Hello, world!");
    let s1 = String::from("hello");
    //引用
    let len: usize = calculate_length(&s1);
    println!("len{},s1{}", len, s1);

    let mut s = String::from("hello");
    //可变引用
    change(&mut s);
    println!("s{}", s);
    test();
    dangle();
}
fn calculate_length(s: &String) -> usize {
    s.len()
}
fn change(s: &mut String) {
    s.push_str(",world");
}
fn test() {
    let mut s = String::from("hello");

    let r1 = &s; // 没问题
    let r2 = &s; // 没问题
    println!("{} and {}", r1, r2);
    // 此位置之后 r1 和 r2 不再使用
    let r3 = &mut s; // 没问题
    println!("r3{}", r3);
    let r4 = &mut s; // 没问题
    println!("r4{}", r4);
}
// fn err() {
//     let mut s = String::from("init");
//     let s1 = &mut s;
//     let s2 = &mut s;
//     println!("{}, {}", s1, s2);
// }
fn dangle() -> String {
    let s = String::from("空指针");
    // &s 这是一个空指针，// 返回字符串 s 的引用

    s //避免报错
} // 这里 s 离开作用域并被丢弃。其内存被释放
